<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.23">
<meta name="description" content="Learn about the USBX Host Services.">
<title>Chapter 4 - Description of USBX Host Services</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment the following line when using as a custom stylesheet */
/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
html{font-family:sans-serif;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
b,strong{font-weight:bold}
abbr{font-size:.9em}
abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
dfn{font-style:italic}
hr{height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type=checkbox],input[type=radio]{padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,::before,::after{box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ul.square{list-style-type:square}
ul.circle ul:not([class]),ul.disc ul:not([class]),ul.square ul:not([class]){list-style:inherit}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child{border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details{margin-left:1.25rem}
details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
details>summary::-webkit-details-marker{display:none}
details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:first-child,.sidebarblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child,.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
pre.pygments span.linenos{display:inline-block;margin-right:.75em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
li>p:empty:only-child::before{content:"";display:inline-block}
ul.checklist>li>p:first-child{margin-left:-1em}
ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}
ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active,#footnotes .footnote a:first-of-type:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,td.hdlist1,span.alt,summary{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]{border-bottom:1px dotted}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
</head>
<body class="article">
<div id="header">
<h1>Chapter 4 - Description of USBX Host Services</h1>
</div>
<div id="content">
<div class="sect1">
<h2 id="_ux_host_stack_initialize">ux_host_stack_initialize</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Initialize USBX for host operation.</p>
</div>
<div class="sect2">
<h3 id="_prototype">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_initialize(
    UINT (*system_change_function)
    (ULONG, UX_HOST_CLASS *,VOID *));</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description">Description</h3>
<div class="paragraph">
<p>This function will initialize the USB host stack and return immediately. The supplied memory area will be setup for USBX internal use. If UX_SUCCESS is returned, USBX is ready for host controller and class registration.</p>
</div>
</div>
<div class="sect2">
<h3 id="_input_parameter">Input Parameter</h3>
<div class="ulist">
<ul>
<li>
<p><em>system_change_function</em>: Pointer to optional callback routine for notifying application of instance changes.
The change callback function is as following:</p>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT demo_ux_system_host_change_function(ULONG change_code, UX_HOST_CLASS *ux_class, VOID *param);</code></pre>
</div>
</div>
<div class="paragraph">
<p>The possible changes notification parameters are:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">UX Change Code</th>
<th class="tableblock halign-left valign-top">Pointer to Class</th>
<th class="tableblock halign-left valign-top">Pointer to Instance</th>
<th class="tableblock halign-left valign-top">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UX_DEVICE_INSERTION</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Class (<code>UX_HOST_CLASS*</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Instance</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Registered class created and activated a function instance</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UX_DEVICE_REMOVAL</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Class (<code>UX_HOST_CLASS*</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Instance</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Function instance is deactivated</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UX_HID_CLIENT_INSERTION</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Class (<code>UX_HOST_CLASS*</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">HID Client (<code>UX_HOST_CLASS_HID_CLIENT*</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">HID class client (keyboard, mouse, remote control &#8230;&#8203;) is activated</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UX_HID_CLIENT_REMOVAL</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Class (<code>UX_HOST_CLASS*</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">HID Client (<code>UX_HOST_CLASS_HID_CLIENT*</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">HID class client is deactivated</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UX_STORAGE_MEDIA_INSERTION</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Class (<code>UX_HOST_CLASS*</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Storage Media (<code>UX_HOST_CLASS_STORAGE_MEDIA*</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Storage media is ready (only available for No-FileX mode)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UX_STORAGE_MEDIA_REMOVAL</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Class (<code>UX_HOST_CLASS*</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Storage Media (<code>UX_HOST_CLASS_STORAGE_MEDIA*</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Storage media is removed (only available for No-FileX mode)</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UX_DEVICE_CONNECTION</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Null (<code>UX_NULL</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Device (<code>UX_DEVICE*</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Device is connected</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">UX_DEVICE_DISCONNECTION</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Null (<code>UX_NULL</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Device (<code>UX_DEVICE*</code>)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Device is disconnected</p></td>
</tr>
</tbody>
</table>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_value">Return Value</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) Successful initialization.</p>
</li>
<li>
<p><strong>UX_MEMORY_INSUFFICIENT</strong> (0x12) A memory allocation failed.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* Initialize USBX for host operation, without notification. */
status = ux_host_stack_initialize(UX_NULL);

/* If status equals UX_SUCCESS, USBX has been successfully initialized for host operation. */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_endpoint_transfer_abort">ux_host_stack_endpoint_transfer_abort</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Abort all transactions attached to a transfer request for an endpoint.</p>
</div>
<div class="sect2">
<h3 id="_prototype_2">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_endpoint_transfer_abort(UX_ENDPOINT *endpoint);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_2">Description</h3>
<div class="paragraph">
<p>This function will cancel all transactions active or pending for a specific transfer request attached to an endpoint and return immediately. If the transfer request has a callback function attached, the callback function will be called with the UX_TRANSACTION_ABORTED status.</p>
</div>
</div>
<div class="sect2">
<h3 id="_input_parameter_2">Input Parameter</h3>
<div class="ulist">
<ul>
<li>
<p><em>endpoint</em>: Pointer to an endpoint.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) No errors.</p>
</li>
<li>
<p><strong>UX_ENDPOINT_HANDLE_UNKNOWN</strong> (0x53) Endpoint handle is not valid.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_2">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UX_HOST_CLASS_PRINTER *printer;
UINT status;

/* Get the instance for this class. */
printer = (UX_HOST_CLASS_PRINTER *) command -&gt;
    ux_host_class_command_instance;

/* The printer is being shut down. */

printer -&gt; printer_state = UX_HOST_CLASS_INSTANCE_SHUTDOWN;

/* We need to abort transactions on the bulk out pipe. */
status = ux_host_stack_endpoint_transfer_abort
    (printer -&gt; printer_bulk_out_endpoint);

/* If status equals UX_SUCCESS, the operation was successful */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_class_get">ux_host_stack_class_get</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Get the pointer to a class container.</p>
</div>
<div class="sect2">
<h3 id="_prototype_3">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_class_get(
    UCHAR *class_name,
    UX_HOST_CLASS **class);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_3">Description</h3>
<div class="paragraph">
<p>This function returns a pointer to the class container immediately. A class needs to obtain its container from the USB stack to search for instances when a class or an application wants to open a device.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
The C string of class_name must be NULL-terminated and the length of it (without the NULL-terminator itself) must be no larger than UX_MAX_CLASS_NAME_LENGTH.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_parameters">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>class_name</em>: Pointer to the class name.</p>
</li>
<li>
<p><em>class</em>: A pointer updated by the function call that contains the class container for the name of the class.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values_2">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) No errors, on return the class field is filed with the pointer to the class container.</p>
</li>
<li>
<p><strong>UX_HOST_CLASS_UNKNOWN</strong> (0x59) Class is unknown by the stack.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_3">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UX_HOST_CLASS *printer_container;
UINT status;

/* Get the container for this class. */
status = ux_host_stack_class_get("ux_host_class_printer", &amp;printer_container);

/* If status equals UX_SUCCESS, the operation was successful */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_class_register">ux_host_stack_class_register</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Register a USB class to the USB stack.</p>
</div>
<div class="sect2">
<h3 id="_prototype_4">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_class_register(
    UCHAR *class_name,
    UINT (*class_entry_address) (struct UX_HOST_CLASS_COMMAND_STRUCT *));</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_4">Description</h3>
<div class="paragraph">
<p>This function registers a USB class to the USB stack and returns immediately. The class must
specify an entry point for the USB stack to send commands such as the following.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>UX_HOST_CLASS_COMMAND_QUERY</strong></p>
</li>
<li>
<p><strong>UX_HOST_CLASS_COMMAND_ACTIVATE</strong></p>
</li>
<li>
<p><strong>UX_HOST_CLASS_COMMAND_DESTROY</strong></p>
</li>
</ul>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
The C string of <em>class_name</em> must be NULL-terminated and the length of it (without the NULL-terminator itself) must be no larger than <strong>UX_MAX_CLASS_NAME_LENGTH</strong>.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_parameters_2">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>class_name</em>: Pointer to the name of the class, valid entries are found in the file ux_system_initialize.c under the USB Classes of USBX.</p>
</li>
<li>
<p><em>class_entry_address</em>: Address of the entry function of the class.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values_3">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) Class installed successfully.</p>
</li>
<li>
<p><strong>UX_MEMORY_ARRAY_FULL</strong> (0x1a) No more memory to store this class.</p>
</li>
<li>
<p><strong>UX_HOST_CLASS_ALREADY_INSTALLED</strong> (0x58) Host class already installed.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_4">Example:</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* Register all the classes for this implementation. */
status = ux_host_stack_class_register("ux_host_class_hub", ux_host_class_hub_entry);

/* If status equals UX_SUCCESS, class was successfully installed. */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_class_instance_create">ux_host_stack_class_instance_create</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Create a new class instance for a class container.</p>
</div>
<div class="sect2">
<h3 id="_prototype_5">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_class_instance_create(
    UX_HOST_CLASS *class,
    VOID *class_instance);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_5">Description</h3>
<div class="paragraph">
<p>This function creates a new class instance for a class container and returns immediately. The instance of a class is not contained in the class code to reduce the class complexity. Rather, each class instance is attached to the class container located in the main stack.</p>
</div>
</div>
<div class="sect2">
<h3 id="_parameters_3">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>class</em>: Pointer to the class container.</p>
</li>
<li>
<p><em>class_instance</em>: Pointer to the class instance to be created.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_value_2">Return Value</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The class instance was attached to the class container.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_5">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

UX_HOST_CLASS_PRINTER *printer;

/* Obtain memory for this class instance. */

printer = ux_memory_allocate(UX_NO_ALIGN, sizeof(UX_HOST_CLASS_PRINTER));

if (printer == UX_NULL)
    return(UX_MEMORY_INSUFFICIENT);

/* Store the class container into this instance. */
printer -&gt; printer_class = command -&gt; ux_host_class;

/* Create this class instance. */
status = ux_host_stack_class_instance_create(printer -&gt; printer_class, (VOID *)printer);

/* If status equals UX_SUCCESS, the class instance was successfully created and attached to the class container. */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_class_instance_destroy">ux_host_stack_class_instance_destroy</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Destroy a class instance for a class container.</p>
</div>
<div class="sect2">
<h3 id="_prototype_6">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_class_instance_destroy(
    UX_HOST_CLASS *class,
    VOID *class_instance);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_6">Description</h3>
<div class="paragraph">
<p>This function destroys a class instance for a class container and returns immediately.</p>
</div>
</div>
<div class="sect2">
<h3 id="_parameters_4">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>class</em>: Pointer to the class container.</p>
</li>
<li>
<p><em>class_instance</em>: Pointer to the instance to destroy.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values_4">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The class instance was destroyed.</p>
</li>
<li>
<p><strong>UX_HOST_CLASS_INSTANCE_UNKNOWN</strong> (0x5b) The class instance is not attached to the class container.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_6">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;
UX_HOST_CLASS_PRINTER *printer;

/* Get the instance for this class. */
printer = (UX_HOST_CLASS_PRINTER *) command -&gt; ux_host_class_command_instance;

/* The printer is being shut down. */
printer -&gt; printer_state = UX_HOST_CLASS_INSTANCE_SHUTDOWN;

/* Destroy the instance. */
status = ux_host_stack_class_instance_destroy(printer -&gt; printer_class, (VOID *) printer);

/* If status equals UX_SUCCESS, the class instance was successfully destroyed. */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_class_instance_get">ux_host_stack_class_instance_get</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Get a class instance pointer for a specific class.</p>
</div>
<div class="sect2">
<h3 id="_prototype_7">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_class_instance_get(
    UX_HOST_CLASS *class,
    UINT class_index,
    VOID **class_instance);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_7">Description</h3>
<div class="paragraph">
<p>This function returns a class instance pointer for a specific class immediately. The instance of a class is not contained in the class code to reduce the class complexity. Rather, each class instance is attached to the class container. This function is used to search for class instances within a class container.</p>
</div>
</div>
<div class="sect2">
<h3 id="_parameters_5">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>class</em>: Pointer to the class container.</p>
</li>
<li>
<p><em>class_index</em>: An index to be used by the function call within the list of attached classes to the container.</p>
</li>
<li>
<p><em>class_instance</em>: Pointer to the instance to be returned by the function call.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values_5">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The class instance was found.</p>
</li>
<li>
<p><strong>UX_HOST_CLASS_INSTANCE_UNKNOWN</strong> (0x5b) There are no more class instances attached to the class container.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_7">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

UX_HOST_CLASS_PRINTER *printer;

/* Obtain memory for this class instance. */
printer = ux_memory_allocate(UX_NO_ALIGN, sizeof(UX_HOST_CLASS_PRINTER));

if (printer == UX_NULL) return(UX_MEMORY_INSUFFICIENT);

/* Search for instance index 2. */
status = ux_host_stack_class_instance_get(class, 2, (VOID *) printer);

/* If status equals UX_SUCCESS, the class instance was found. */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_device_configuration_get">ux_host_stack_device_configuration_get</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Get a pointer to a configuration container.</p>
</div>
<div class="sect2">
<h3 id="_prototype_8">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_device_configuration_get(
    UX_DEVICE *device,
    UINT configuration_index,
    UX_CONFIGURATION *configuration);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_8">Description</h3>
<div class="paragraph">
<p>This function returns a configuration container based on a device handle and a configuration index, immediately.</p>
</div>
</div>
<div class="sect2">
<h3 id="_parameters_6">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>device</em>: Pointer to the device container that owns the configuration requested.</p>
</li>
<li>
<p><em>configuration_index</em>: Index of the configuration to be searched.</p>
</li>
<li>
<p><em>configuration</em>: Address of the pointer to the configuration container to be returned.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values_6">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The configuration was found.</p>
</li>
<li>
<p><strong>UX_DEVICE_HANDLE_UNKNOWN</strong> (0x50) The device container does not exist.</p>
</li>
<li>
<p><strong>UX_CONFIGURATION_HANDLE_UNKNOWN</strong> (0x51) The configuration handle for the index does not exist.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_8">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

UX_HOST_CLASS_PRINTER *printer;

/* If the device has been configured already, we don't need to do it
again. */

if (printer -&gt; printer_device -&gt; ux_device_state == UX_DEVICE_CONFIGURED)
    return(UX_SUCCESS);

/* A printer normally has one configuration, retrieve 1st configuration only. */

status = ux_host_stack_device_configuration_get(printer -&gt; printer_device,
    0, configuration);

/* If status equals UX_SUCCESS, the configuration was found. */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_device_configuration_select">ux_host_stack_device_configuration_select</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Select a specific configuration for a device.</p>
</div>
<div class="sect2">
<h3 id="_prototype_9">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_device_configuration_select (UX_CONFIGURATION *configuration);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_9">Description</h3>
<div class="paragraph">
<p>This function selects a specific configuration for a device. When this configuration is set to the device, by default, each device interface and its associated alternate setting 0 is activated on the device. If the device/interface class wishes to change the setting of a particular interface. It issues a <strong>ux_host_stack_configuration_set</strong> service call and wait it end to continue.</p>
</div>
</div>
<div class="sect2">
<h3 id="_parameters_7">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>configuration</em>: Pointer to the configuration container that is to be enabled for this device.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values_7">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The configuration selection was successful.</p>
</li>
<li>
<p><strong>UX_CONFIGURATION_HANDLE_UNKNOWN</strong> (0x51) The configuration handle does not exist.</p>
</li>
<li>
<p><strong>UX_OVER_CURRENT_CONDITION</strong> (0x43) An over current condition exists on the bus for this configuration.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_9">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

UX_HOST_CLASS_PRINTER *printer;

/* If the device has been configured already, we don't need to do it again. */
if (printer -&gt; printer_device -&gt; ux_device_state == UX_DEVICE_CONFIGURED)
    return(UX_SUCCESS);

/* A printer normally has one configuration - retrieve 1st configuration only. */
status = ux_host_stack_device_configuration_get(printer -&gt; printer_device, 0,configuration);

/* If status equals UX_SUCCESS, the configuration selection was successful. */

/* If valid configuration, ask USBX to set this configuration. */
status = ux_host_stack_device_configuration_select(configuration);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_device_get">ux_host_stack_device_get</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Get a pointer to a device container.</p>
</div>
<div class="sect2">
<h3 id="_prototype_10">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_device_get(
    ULONG device_index,
    UX_DEVICE *device);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_10">Description</h3>
<div class="paragraph">
<p>This function returns a device container based on its index immediately. The device index starts with 0. Note that the index is a ULONG because we could have several controllers and a byte index might not be enough. The device index should not be confused with the device address that is bus specific.</p>
</div>
</div>
<div class="sect2">
<h3 id="_parameters_8">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>device_index</em>: Index of the device.</p>
</li>
<li>
<p><em>device</em>: Address of the pointer for the device container to return.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values_8">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The device container exists and is returned</p>
</li>
<li>
<p><strong>UX_DEVICE_HANDLE_UNKNOWN</strong> (0x50) Device unknown</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_10">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* Locate the first device in USBX. */
status = ux_host_stack_device_get(0, device);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_interface_endpoint_get">ux_host_stack_interface_endpoint_get</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Get an endpoint container.</p>
</div>
<div class="sect2">
<h3 id="_prototype_11">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_interface_endpoint_get(
    UX_INTERFACE *interface,
    UINT endpoint_index,
    UX_ENDPOINT *endpoint);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_11">Description</h3>
<div class="paragraph">
<p>This function returns an endpoint container based on the interface handle and an endpoint index immediately. It is assumed that the alternate setting for the interface has been selected or the default setting is being used prior to the endpoint(s) being searched.</p>
</div>
</div>
<div class="sect2">
<h3 id="_parameters_9">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>interface</em>: Pointer to the interface container that contains the endpoint requested.</p>
</li>
<li>
<p><em>endpoint_index</em>: Index of the endpoint in this interface.</p>
</li>
<li>
<p><em>endpoint</em>: Address of the endpoint container to be returned.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values_9">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The endpoint container exists and is returned.</p>
</li>
<li>
<p><strong>UX_INTERFACE_HANDLE_UNKNOWN</strong> (0x52) Interface specified does not exist.</p>
</li>
<li>
<p><strong>UX_ENDPOINT_HANDLE_UNKNOWN</strong> (0x53) Endpoint index does not exist.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_11">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;
UX_HOST_CLASS_PRINTER *printer;

for(endpoint_index = 0;
    endpoint_index &lt; printer -&gt; printer_interface -&gt;
        ux_interface_descriptor.bNumEndpoints;
    endpoint_index++)
{
    status = ux_host_stack_interface_endpoint_get (printer -&gt; printer_interface,
        endpoint_index, &amp;endpoint);

    if (status == UX_SUCCESS)
    {
        /* Check if endpoint is bulk and OUT. */
        if (((endpoint -&gt; ux_endpoint_descriptor.bEndpointAddress &amp;
            UX_ENDPOINT_DIRECTION) == UX_ENDPOINT_OUT) &amp;&amp;
            ((endpoint -&gt; ux_endpoint_descriptor.bmAttributes &amp;
            UX_MASK_ENDPOINT_TYPE) == UX_BULK_ENDPOINT))
        return(UX_SUCCESS);
    }
}</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_hcd_register">ux_host_stack_hcd_register</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Register a USB controller to the USB stack.</p>
</div>
<div class="sect2">
<h3 id="_prototype_12">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_hcd_register(
    UCHAR *hcd_name,
    UINT (*hcd_function)(struct UX_HCD_STRUCT *),
    ULONG hcd_param1, ULONG hcd_param2);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_12">Description</h3>
<div class="paragraph">
<p>This function registers a USB controller to the USB stack and returns immediately. It mainly allocates the memory used by this controller and passes the initialization command to the controller.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
The C string of hcd_name must be NULL-terminated and the length of it (without the NULL-terminator itself) must be no larger than <strong>UX_MAX_HCD_NAME_LENGTH</strong>.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_parameters_10">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>hcd_name</em>: Name of the host controller</p>
</li>
<li>
<p><em>hcd_function</em>: The function in the host controller responsible for the initialization.</p>
</li>
<li>
<p><em>hcd_param1</em>: The IO or memory resource used by the hcd.</p>
</li>
<li>
<p><em>hcd_param2</em>: The IRQ used by the host controller.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values_10">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The controller was initialized properly.</p>
</li>
<li>
<p><strong>UX_MEMORY_INSUFFICIENT</strong> (0x12) Not enough memory for this controller.</p>
</li>
<li>
<p><strong>UX_PORT_RESET_FAILED</strong> (0x31) The reset of the controller failed.</p>
</li>
<li>
<p><strong>UX_CONTROLLER_INIT_FAILED</strong> (0x32) The controller failed to initialize properly.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_12">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* Initialize a host controller mapped at address 0xd0000 and using IRQ 10. */

status = ux_host_stack_hcd_register("ux_hcd_controller",
    ux_hcd_controller_initialize, 0xd0000, 0x0a);

/* If status equals UX_SUCCESS, the controller was initialized properly. */

/* Note that the application must also setup a call to the
    interrupt handler for the controller.
    The function for the controller is called _ux_hch_controller_interrupt_handler. */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_configuration_interface_get">ux_host_stack_configuration_interface_get</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Get an interface container pointer.</p>
</div>
<div class="sect2">
<h3 id="_prototype_13">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_configuration_interface_get (
    UX_CONFIGURATION *configuration,
    UINT interface_index,
    UINT alternate_setting_index,
    UX_INTERFACE **interface);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_13">Description</h3>
<div class="paragraph">
<p>This function returns an interface container based on a configuration handle, an interface index, and an alternate setting index, immediately.</p>
</div>
</div>
<div class="sect2">
<h3 id="_parameters_11">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>configuration</em>: Pointer to the configuration container that owns the interface.</p>
</li>
<li>
<p><em>interface_index</em>: Interface index to be searched.</p>
</li>
<li>
<p><em>alternate_setting_index</em>: Alternate setting within the interface to search.</p>
</li>
<li>
<p><em>interface</em>: Address of the interface container pointer to be returned.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values_11">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The interface container for the interface index and the alternate setting was found and returned.</p>
</li>
<li>
<p><strong>UX_CONFIGURATION_HANDLE_UNKNOWN</strong> (0x51) The configuration does not exist.</p>
</li>
<li>
<p><strong>UX_INTERFACE_HANDLE_UNKNOWN</strong> (0x52) The interface does not exist.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_13">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* Search for the default alternate setting on the first interface for the printer. */
status = ux_host_stack_configuration_interface_get(configuration, 0, 0,
    &amp;printer -&gt; printer_interface);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_interface_setting_select">ux_host_stack_interface_setting_select</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Select an alternate setting for an interface.</p>
</div>
<div class="sect2">
<h3 id="_prototype_14">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_interface_setting_select(UX_INTERFACE *interface);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_14">Description</h3>
<div class="paragraph">
<p>This function selects a specific alternate setting for a given interface belonging to the selected configuration. This function is used to change from the default alternate setting to a new setting or to go back to the default alternate setting. When a new alternate setting is selected, the previous endpoint characteristics are invalid and should be reloaded. It issues a <strong>_ux_host_stack_interface_set</strong> service call, where transfer request is issued an waited before continue.</p>
</div>
</div>
<div class="sect2">
<h3 id="_input_parameter_3">Input Parameter</h3>
<div class="ulist">
<ul>
<li>
<p><em>interface</em>: Pointer to the interface container whose alternate setting is to be selected.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values_12">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The alternate setting for this interface has been successfully selected.</p>
</li>
<li>
<p><strong>UX_INTERFACE_HANDLE_UNKNOWN</strong> (0x52) The interface does not exist.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_14">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* Select a new alternate setting for this interface. */
status = ux_host_stack_interface_setting_select(interface);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_transfer_request_abort">ux_host_stack_transfer_request_abort</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Abort a pending transfer request.</p>
</div>
<div class="sect2">
<h3 id="_prototype_15">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_transfer_request_abort(UX_TRANSFER REQUEST *transfer request);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_15">Description</h3>
<div class="paragraph">
<p>This function aborts a pending transfer request that has been previously submitted and returns immediately. This function only cancels a specific transfer request. The call back to the function will have the UX_TRANSFER REQUEST_STATUS_ABORT status.</p>
</div>
</div>
<div class="sect2">
<h3 id="_parameters_12">Parameters</h3>
<div class="ulist">
<ul>
<li>
<p><em>transfer request</em>: Pointer to the transfer request to be aborted.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values_13">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The USB transfer for this transfer request was
canceled.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_15">Example</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* The following example illustrates this service. */
status = ux_host_stack_transfer_request_abort(transfer request);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ux_host_stack_transfer_request">ux_host_stack_transfer_request</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Request a USB transfer.</p>
</div>
<div class="sect2">
<h3 id="_prototype_16">Prototype</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT ux_host_stack_transfer_request(UX_TRANSFER REQUEST *transfer request);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_description_16">Description</h3>
<div class="paragraph">
<p>This function performs a USB transaction. On entry the transfer request gives the endpoint pipe selected for this transaction and the parameters associated with the transfer (data payload, length of transaction). For Control pipe, the transaction is blocking and will only return when the three phases of the control transfer have been completed or if there is a previous error. For other pipes, the USB stack will schedule the transaction on the USB but will not wait for its completion. Each transfer request for non-blocking pipes has to specify a completion routine handler.</p>
</div>
<div class="paragraph">
<p>When the function call returns, the status of the transfer request should be examined as it contains the result of the transaction.</p>
</div>
</div>
<div class="sect2">
<h3 id="_input_parameter_4">Input Parameter</h3>
<div class="ulist">
<ul>
<li>
<p><em>transfer_request</em>: Pointer to the transfer request. The transfer request contains all the necessary information required for the transfer.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_return_values_14">Return Values</h3>
<div class="ulist">
<ul>
<li>
<p><strong>UX_SUCCESS</strong> (0x00) The USB transfer for this transfer request was scheduled properly. The status code of the transfer request should be examined when the transfer request completes.</p>
</li>
<li>
<p><strong>UX_MEMORY_INSUFFICIENT</strong> (0x12) Not enough memory to allocate the necessary controller resources.</p>
</li>
<li>
<p><strong>UX_TRANSFER_NOT_READY</strong> (0x25) The device was in an invalid state&#8201;&#8212;&#8201;must be ATTACHED,ADDRESSED, or CONFIGURED.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_example_16">Example:</h3>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c" data-lang="c">UINT status;

/* Create a transfer request for the SET_CONFIGURATION request. No data for this request. */
transfer_request -&gt; ux_transfer_request_requested_length = 0;
transfer_request -&gt; ux_transfer_request_function = UX_SET_CONFIGURATION;
transfer_request -&gt; ux_transfer_request_type =
    | UX_REQUEST_OUT           |
    | UX_REQUEST_TYPE_STANDARD |
    UX_REQUEST_TARGET_DEVICE;

transfer_request -&gt; ux_transfer_request_value = (USHORT)
    configuration -&gt; ux_configuration_descriptor.bConfigurationValue;
transfer_request -&gt; ux_transfer_request_index = 0;

/* Send request to HCD layer. */
status = ux_host_stack_transfer_request(transfer_request);

/* If status equals UX_SUCCESS, the operation was successful. */</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2025-02-07 08:25:21 UTC
</div>
</div>
</body>
</html>